﻿using Prism.Commands;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

//界面来看 数据没有绑定上
//1、数据关系不对 XAML绑定失败窗口
//2、ViewModel没有匹配上：通过ViewModel的构造函数打断点判断 匹配关系没有处理好
namespace PrismRegionNavigation.ViewModels.Pages
{
    public class ViewAViewModel : INavigationAware,IRegionMemberLifetime,IConfirmNavigationRequest
    {
        public string Title { get; set; } = "View A";

        /// <summary>
        /// 关闭当前页签命令
        /// </summary>
        public ICommand CloseTabCommand { get; set; }

        IRegionManager _regionManager;

        public ViewAViewModel(IRegionManager regionManager)
        {
            _regionManager = regionManager;
            CloseTabCommand = new DelegateCommand(DoCloseTab);
        }

        private void DoCloseTab()
        {
            //关闭当前页签
            var region = _regionManager.Regions["ContentRegion"];
            var view = region.Views.FirstOrDefault(v => v.GetType().Name == "ViewA");
            region.Remove(view);

            region.RemoveAll();//关闭所有页签
        }

        #region INavigationAware接口方法
        /// <summary>
        /// 是否允许重复导航进来
        /// 如果是false 会重复创建对象 新的对象    A->B->A(新对象)
        /// 如果是true 显示前对象                  A->B->A(前对象)
        /// </summary>
        /// <param name="navigationContext"></param>
        /// <returns></returns>
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;


            //编辑页面，通过主页的子项点击，打开这个页面
            //子项有很多，可能同时打开多个子项进行编辑
        }

        /// <summary>
        /// 从当前view导航出去的时候触发
        /// 从某个页面跳转到另一个页面的时候  可以把这个信息带过去
        /// 从当前页面离开 去另外一个页面
        /// </summary>
        /// <param name="navigationContext"></param>
        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
            navigationContext.Parameters.Add("abcd", "hello world");//传递参数
        }

        /// <summary>
        /// 打开当前view的时候触发
        /// </summary>
        /// <param name="navigationContext">导航的上下文</param>
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            string value1 = navigationContext.Parameters.GetValue<string>("parameter1");
            //string value1 = navigationContext.Parameters["parameter1"].ToString();//一般使用上面的写法
        }
        #endregion

        #region IRegionMemberLifetime接口方法
        /// <summary>
        /// 用来控制当前页面非激活状态 是否在region中保留
        /// 默认情况下是True
        /// 控制页面是否自动销毁
        /// </summary>
        public bool KeepAlive => true;
        #endregion

        #region IConfirmNavigationRequest接口方法
        /// <summary>
        /// 从当前页面导航到另一个页面之前触发
        /// 询问是否可以导航
        /// </summary>
        /// <param name="navigationContext"></param>
        /// <param name="continuationCallback"></param>
        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
        {
            //打开某个页面，
            if (MessageBox.Show("是否打开？", "导航提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
            {
                //继续打开
                continuationCallback?.Invoke(true);//这里只需要调用就行
            }
            //不被导航
            else
            {
                //取消打开
                continuationCallback?.Invoke(false);
            }
        }
        #endregion
    }
}
